Stridedslice

对输入张量进行步长切片(Strided Slice)操作。该算子根据起始位置(begins)、结束位置(ends)和步长(strides)从输入张量中提取子张量。该算子不区分数据类型,适用于所有数据类型。

算法支持三种运行模式: 1. 全拷贝模式**(soft_copy_mode = 1):当输出是输入的连续子区域时,使用内存拷贝。 2. **快速运行模式**(fast_run = 1):优化的快速路径,适用于特定场景。 3. **普通模式:逐块拷贝模式,适用于一般情况。

对于每个维度 i,输出张量的索引范围由 begins[i]ends[i]strides[i] 决定:

\[\text{output\_shape}[i] = \left\lceil \frac{\text{ends}[i] - \text{begins}[i]}{\text{strides}[i]} \right\rceil\]
输入:
  • input - 输入数据指针(void*)。

  • in_shape - 输入张量的形状数组(int*),大小为 in_shape_size

  • out_shape - 输出张量的形状数组(int*),大小为 out_shape_size

  • in_shape_size - 输入张量的维度数(int)。

  • out_shape_size - 输出张量的维度数(int)。

  • begins - 起始位置数组(int*),每个维度切片开始的位置。

  • ends - 结束位置数组(int*),每个维度切片结束的位置。

  • strides - 步长数组(int*),每个维度的步长。

  • data_type_bytes - 数据类型所占字节数(int)。

  • soft_copy_mode - 全拷贝模式标志(int),1 表示启用,0 表示不启用。

  • fast_run - 快速运行模式标志(int),1 表示启用,0 表示不启用。

  • split_axis - 策略2:分割轴(int),当输入和输出张量只有1个维度不同时使用。

  • inner_size - 策略2:内部大小(int)。

  • outer - 策略2:外部大小(int)。

  • parallel_on_outer - 策略2:是否在外层并行(int)。

  • parallel_on_split_axis - 策略2:是否在分割轴并行(int)。

  • cal_num_per_thread - 策略2:每个线程的计算数量(int)。

  • caled_num - 策略2:已计算数量(int)。

  • temp_space - 临时空间指针(void*)。

  • inner - 策略2:内部大小(int),与 inner_size 类似。

输出:
  • output - 输出数据指针(void*)。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持fp32, int8, int16, int32, fp64, cplx64, cplx128

  • MT7004 支持fp16, fp32, int16, int32, cplx64

  • 该算子不区分数据类型,适用于所有数据类型

  • 算子会根据 soft_copy_modefast_run 标志自动选择最优的执行路径

  • 策略2相关参数用于优化特定场景(输入和输出张量只有1个维度不同)

共享存储版本:

void stridedslice(void *input, void *output, int *in_shape, int *out_shape, int in_shape_size, int out_shape_size, int *begins, int *ends, int *strides, int data_type_bytes, int soft_copy_mode, int fast_run, int split_axis, int inner_size, int outer, int parallel_on_outer, int parallel_on_split_axis, int cal_num_per_thread, int caled_num, void *temp_space, int inner, int core_mask)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <stridedslice.h>
 4
 5int main(int argc, char* argv[]) {
 6    // 假设在DDR空间
 7    // 输入张量形状 [2, 3, 4, 5]
 8    int in_shape[] = {2, 3, 4, 5};
 9    int in_shape_size = 4;
10
11    // 输出张量形状 [1, 2, 2, 3]
12    // 从 [0, 1, 1, 2] 开始,到 [2, 3, 4, 5] 结束,步长为 [1, 1, 2, 1]
13    int out_shape[] = {1, 2, 2, 3};
14    int out_shape_size = 4;
15
16    // 切片参数
17    int begins[] = {0, 1, 1, 2};  // 每个维度的起始位置
18    int ends[] = {2, 3, 4, 5};     // 每个维度的结束位置
19    int strides[] = {1, 1, 2, 1};  // 每个维度的步长
20
21    // 数据类型:float32,占4字节
22    int data_type_bytes = 4;
23
24    // 输入输出数据指针
25    float *input = (float *)0xA0000000;
26    float *output = (float *)0xB0000000;
27
28    // 运行模式
29    int soft_copy_mode = 0;  // 不启用全拷贝模式
30    int fast_run = 0;         // 不启用快速运行模式
31
32    // 策略2参数(不使用时可设为0)
33    int split_axis = 0;
34    int inner_size = 0;
35    int outer = 0;
36    int parallel_on_outer = 0;
37    int parallel_on_split_axis = 0;
38    int cal_num_per_thread = 0;
39    int caled_num = 0;
40    int inner = 0;
41
42    // 临时空间
43    void *temp_space = (void *)0xC0000000;
44
45    // 核掩码
46
47    stridedslice(input, output, in_shape, out_shape, in_shape_size, out_shape_size,
48                   begins, ends, strides, data_type_bytes, soft_copy_mode, fast_run,
49                   split_axis, inner_size, outer, parallel_on_outer, parallel_on_split_axis,
50                   cal_num_per_thread, caled_num, temp_space, inner);
51
52    return 0;
53}

私有存储版本:

void stridedslice(void *input, void *output, int *in_shape, int *out_shape, int in_shape_size, int out_shape_size, int *begins, int *ends, int *strides, int data_type_bytes, int soft_copy_mode, int fast_run, int split_axis, int inner_size, int outer, int parallel_on_outer, int parallel_on_split_axis, int cal_num_per_thread, int caled_num, void *temp_space, int inner)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <stridedslice.h>
 4
 5int main(int argc, char* argv[]) {
 6    // 假设在L2空间
 7    int in_shape[] = {2, 3, 4, 5};
 8    int in_shape_size = 4;
 9
10    int out_shape[] = {1, 2, 2, 3};
11    int out_shape_size = 4;
12
13    int begins[] = {0, 1, 1, 2};
14    int ends[] = {2, 3, 4, 5};
15    int strides[] = {1, 1, 2, 1};
16
17    int data_type_bytes = 4;
18
19    float *input = (float *)0x10000000;
20    float *output = (float *)0x10010000;
21
22    int soft_copy_mode = 0;
23    int fast_run = 0;
24
25    // 策略2参数(不使用)
26    int split_axis = 0;
27    int inner_size = 0;
28    int outer = 0;
29    int parallel_on_outer = 0;
30    int parallel_on_split_axis = 0;
31    int cal_num_per_thread = 0;
32    int caled_num = 0;
33    int inner = 0;
34
35    void *temp_space = (void *)0x10020000;
36
37    stridedslice(input, output, in_shape, out_shape, in_shape_size, out_shape_size,
38                  begins, ends, strides, data_type_bytes, soft_copy_mode, fast_run,
39                  split_axis, inner_size, outer, parallel_on_outer, parallel_on_split_axis,
40                  cal_num_per_thread, caled_num, temp_space, inner);
41
42    return 0;
43}